package com.ssd.handler;

import com.ssd.service.IActivityService;
import com.ssd.service.ICouponService;
import com.ssd.sync.SyncManager;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * xxl-job任务处理器
 */
@Component
@Slf4j
public class XxlJobHandler {
    @Resource
    private IActivityService activityService;
    @Resource
    private ICouponService couponService;
    // 用于资源注入的注解，自动装配SyncManager实例
    @Resource
    private SyncManager syncManager;


    // 指定名称的资源注入，自动装配名为"syncThreadPool"的ThreadPoolExecutor实例
    @Resource(name = "syncThreadPool")
    private ThreadPoolExecutor threadPoolExecutor;
    /**
     * 抢券同步任务
     * 此方法通过SyncManager启动同步任务，将优惠券信息从数据库同步到Redis中
     * 使用自定义线程池执行同步任务，提高性能
     */
    @XxlJob("seizeCouponSyncJob")
    public void seizeCouponSyncJob(){
        /**
         * 开始同步，可以使用自定义线程池，如果不设置使用默认线程池
         * @param queueName 同步队列名称
         * @param storageType 数据存储类型，1：redis hash数据结构，2：redis list数据结构，3：redis zSet结构
         * @param mode 1 单条执行 2批量执行
         * @param dataSyncExecutor 数据同步线程池
         */
        syncManager
                .start(
                        "COUPON:SEIZE:SYNC"
                        ,1
                        ,1
                        ,threadPoolExecutor);
    }


    /**
     * 优惠券活动定时预热
     * 此方法用于在整点时预热活动，以便在活动开始前做好准备
     */
    @XxlJob("activityPreHead")
    public void activityPreHead(){
        log.info("优惠券活动定时预热-------");
        try {
            activityService.preHead();
        }catch (Exception e){
            e.printStackTrace();
            log.info("优惠券活动定时预热出错：{}",e.getMessage());
        }
    }

    /**
     * 定时任务修改活动状态
     */
    @XxlJob("updateActivityStatus")
    public void updateActivityStatus(){
        log.info("定时修改活动状态------");
        try {
            activityService.updateStatus();
        }catch (Exception e){
            e.printStackTrace();
            log.info("定时修改活动状态出错：{}",e.getMessage());
        }
    }

    /**
     * 定时任务处理过期优惠券
     */
    @XxlJob("processExpireCoupon")
    public void processExpireCoupon(){
        log.info("定时处理过期优惠券-------");
        try {
            couponService.processExpireCoupon();
        }catch (Exception e){
            e.printStackTrace();
            log.info("定时处理过期优惠券出错：{}",e.getMessage());
        }
    }

}
